package com.sun.volatiles;

import org.omg.CORBA.TIMEOUT;

import java.util.concurrent.TimeUnit;
//资源类1
class MyData{
    int num = 0;

    public void addnum(){
        this.num = 60;
    }
}
//资源类2 添加volatile
class MyDataVolatile{
    volatile int num = 0;
    //共享变量可见性：增强了主内存和各个线程之间得可见性
    public void addnum(){
        this.num = 60;
    }
}
//不添加volatile关键字测试
public class StudyVolatile {
    /**
     * volatile是Java虚拟机提供的轻量级的同步机制，三大特性：
     * 1.保证可见性
     * 2.不保证原子性
     * 3.禁止指令重排
     * @param args
     */
    public static void main(String[] args) {

        MyData myData = new MyData();
        //第一个线程是AAA
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t come in");
            try {
                TimeUnit.SECONDS.sleep(3);
            }catch (Exception e){e.printStackTrace();}
            myData.addnum();
            System.out.println(Thread.currentThread().getName()+"\t update nember value:"+myData.num);
        },"AAA").start();

        //第二个线程是main线程
        while (myData.num == 0){
            //main线程一直在等待循环，直到num不等于0
        }
        System.out.println(Thread.currentThread().getName()+"\t mission is over");
    }
    /*
     *1.验证volatile的可见性
     * 1.1假如int num = 0； num变量之前根本没有添加volatile关键字修饰,没有可见性
     * */

}
//添加volatile得测试
class AddVolatile {
    /**
     * volatile是Java虚拟机提供的轻量级的同步机制，三大特性：
     * 1.保证可见性
     * 2.不保证原子性
     * 3.禁止指令重排
     * @param args
     */
    public static void main(String[] args) {

        MyDataVolatile myDataVolatile = new MyDataVolatile();
        //第一个线程是AAA
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t come in");
            try {
                TimeUnit.SECONDS.sleep(3);
            }catch (Exception e){e.printStackTrace();}
            myDataVolatile.addnum();
            System.out.println(Thread.currentThread().getName()+"\t update nember value:"+myDataVolatile.num);
        },"AAA").start();

        //第二个线程是main线程
        while (myDataVolatile.num == 0){
            //main线程一直在等待循环，直到num不等于0
        }
        System.out.println(Thread.currentThread().getName()+"\t mission is over，main get num value: "+myDataVolatile.num);
    }
    /*
     *1.验证volatile的可见性
     * 1.1假如int num = 0； num变量添加volatile关键字修饰,具有可见性
     * */

}